package com.kdzy.lshy.socity_server.service;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.kdzy.lshy.socity_server.common.ExceptionDetailMessage;
import com.kdzy.lshy.socity_server.common.ResultMap;
import com.kdzy.lshy.socity_server.repository.BaseDao;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.*;

/**
 * 全局查询service
 * @author cly
 * @since 2018-06-21
 */
@Service
public class GlobleQueryService extends BaseService {

    private static final Logger logger = LoggerFactory.getLogger(GlobleQueryService.class);

    @Resource
    private BaseDao baseDao;

    public Object getAllByCondition(String param) {
        LinkedHashMap<Object, Object> map = null;
        try {
            if (StringUtils.isNotEmpty(StringUtils.trim(param))){
                // 解析数据，层级关系： 部门 窗口 业务
                // 1.解析json数据
                JSONObject jsonObject = JSON.parseObject(param);
                Long stamp = (Long) jsonObject.get("stamp"); // 时间戳
                String socityID = (String)jsonObject.get("socityID"); // 社区id
                Integer version = (Integer) jsonObject.get("version"); // 数据版本 0:测试 1:生产
                Integer isUsed = jsonObject.getInteger("is_used"); // 是否有效 0:有效 1:无效
                Integer visitType = jsonObject.getInteger("visit_type"); // 访问类型 0测试 1生产
                String content = StringUtils.trim((String)jsonObject.get("content")); // 输入框内容 去除两边的空格

                // 参数非空判断
                if (!StringUtils.isNoneBlank(StringUtils.trim(socityID))) {
                    logger.info("参数socityID为空");
                    map = ResultMap.creatReault("88", "失败", "参数为空");
                    logger.info("出去《全局查询 -- 根据级别查询》list()方法；出参 = " + JSON.toJSONString(map));
                    return map;
                }
                if (version == null) {
                    logger.info("参数version为空");
                    map = ResultMap.creatReault("88", "失败", "参数为空");
                    logger.info("出去《全局查询 -- 根据级别查询》list()方法；出参 = " + JSON.toJSONString(map));
                    return map;
                }
                if (isUsed == null) {
                    logger.info("参数is_used为空");
                    map = ResultMap.creatReault("88", "失败", "参数为空");
                    logger.info("出去《全局查询 -- 根据级别查询》list()方法；出参 = " + JSON.toJSONString(map));
                    return map;
                }
                if (visitType == null) {
                    logger.info("参数visit_type为空");
                    map = ResultMap.creatReault("88", "失败", "参数为空");
                    logger.info("出去《全局查询 -- 根据级别查询》list()方法；出参 = " + JSON.toJSONString(map));
                    return map;
                }

                // 定义返回controller结果
                List<Map<String, Object>> mapList = null;

                // 动态参数集合
                List<Object> tags = null;
                // 查询的显示级别
                Map<String, Object> mapView = new HashMap<String, Object>();
                // 定义sql
                String sql = null;

                // 2.根据查询规则来解析数据
                if (StringUtils.equals("", content)) {
                    // 默认查询全部
                    // 直接查询部门信息
                    logger.info("查询全部部门");
                    // 查询部门
                    // 1.封装sql
                    sql = "SELECT\n" +
                            "\tdep.ID,\n" +
                            "\tdep.dep_name,\n" +
                            "\tdl.descs,\n" +
                            "\tdl.url\n" +
                            "FROM\n" +
                            "\tdepartments dep,\n" +
                            "\tsocity s,\n" +
                            "\tsocity_department sd,\n" +
                            "\tdep_logo dl\n" +
                            "WHERE\n" +
                            "\ts.ID = sd.soc_id\n" +
                            "AND\n" +
                            "\tsd.dep_id = dep.ID\n" +
                            "AND\n" +
                            "\tdep.ID = dl.dep_id\n" +
                            "AND\n" +
                            "\ts.ID = ?\n" +
                            "AND\n" +
                            "\ts.version = ?\n" +
                            "AND\n" +
                            "\ts.is_used = ?\n" +
                            "AND\n" +
                            "\ts.visit_type = ?\n";
                    logger.info("查询全部部门 - sql = " + sql);

                    // 2.收集数据
                    tags = new ArrayList<Object>();
                    tags.add(socityID); // 社区id
                    tags.add(version); // 数据版本
                    tags.add(isUsed); // 是否有效
                    tags.add(visitType); // 访问类型 0测试 1生产
                    logger.info("查询部门 - tags = " + tags);

                    // 3.调用dao查询数据
                    mapList = baseDao.queryForList(sql, tags.toArray());

                    if (mapList == null || mapList.size() ==0) {
                        map = ResultMap.creatReault("1", "成功", "结果集为空");
                        map.put("type", 1); // 部门

                        logger.info("出去《全局查询 -- 根据级别查询》list()方法；出参 = " + JSON.toJSONString(map));
                        return  map;
                    }

                    map = ResultMap.creatReault("0", "成功", mapList);
                    map.put("type", 1); // 部门

                    logger.info("出去《全局查询 -- 根据级别查询》list()方法；出参 = " + JSON.toJSONString(map));
                    return map;
                }
                if(content != null){
                    if (!content.contains(" ")) {
                        // 直接查询部门信息
                        logger.info("查询部门");
                        // 查询部门
                        // 1.封装sql
                        sql = "SELECT\n" +
                                "\tdep.ID,\n" +
                                "\tdep.dep_name,\n" +
                                "\tdl.descs,\n" +
                                "\tdl.url\n" +
                                "FROM\n" +
                                "\tdepartments dep,\n" +
                                "\tsocity s,\n" +
                                "\tsocity_department sd,\n" +
                                "\tdep_logo dl\n" +
                                "WHERE\n" +
                                "\ts.ID = sd.soc_id\n" +
                                "AND\n" +
                                "\tsd.dep_id = dep.ID\n" +
                                "AND\n" +
                                "\tdep.ID = dl.dep_id\n" +
                                "AND\n" +
                                "\ts.ID = ?\n" +
                                "AND\n" +
                                "\ts.version = ?\n" +
                                "AND\n" +
                                "\ts.is_used = ?\n" +
                                "AND\n" +
                                "\ts.visit_type = ?\n" +
                                "AND\n" +
                                "\tdep.dep_name LIKE ?";
                        logger.info("查询部门 - sql = " + sql);

                        // 2.收集数据
                        tags = new ArrayList<Object>();
                        tags.add(socityID); // 社区id
                        tags.add(version); // 数据版本
                        tags.add(isUsed); // 是否有效
                        tags.add(visitType); // 访问类型 0测试 1生产
                        tags.add("%" + content + "%"); // 部门名称
                        logger.info("查询部门 - tags = " + tags);

                        // 3.调用dao查询数据
                        mapList = baseDao.queryForList(sql, tags.toArray());

                        if (mapList == null || mapList.size() ==0) {
                            map = ResultMap.creatReault("1", "成功", "结果集为空");
                            map.put("type", 1); // 部门

                            logger.info("出去《全局查询 -- 根据级别查询》list()方法；出参 = " + JSON.toJSONString(map));
                            return  map;
                        }

                        map = ResultMap.creatReault("0", "成功", mapList);
                        map.put("type", 1); // 部门

                        logger.info("出去《全局查询 -- 根据级别查询》list()方法；出参 = " + JSON.toJSONString(map));
                        return map;
                    }

                    // 根据空格获取分级关键字
                    String[] split = content.split(" ");
                    logger.info("查询内容分级之后的数组：" + split.toString());
                    if(split != null && split.length > 0){
                        switch (split.length) {
                            case 1:
                                logger.info("查询部门");
                                // 查询部门
                                // 1.封装sql
                                sql = "SELECT\n" +
                                        "\tdep.ID,\n" +
                                        "\tdep.dep_name,\n" +
                                        "\tdl.descs,\n" +
                                        "\tdl.url\n" +
                                        "FROM\n" +
                                        "\tdepartments dep,\n" +
                                        "\tsocity s,\n" +
                                        "\tsocity_department sd,\n" +
                                        "\tdep_logo dl\n" +
                                        "WHERE\n" +
                                        "\ts.ID = sd.soc_id\n" +
                                        "AND\n" +
                                        "\tsd.dep_id = dep.ID\n" +
                                        "AND\n" +
                                        "\tdep.ID = dl.dep_id\n" +
                                        "AND\n" +
                                        "\ts.ID = ?\n" +
                                        "AND\n" +
                                        "\ts.version = ?\n" +
                                        "AND\n" +
                                        "\ts.is_used = ?\n" +
                                        "AND\n" +
                                        "\ts.visit_type = ?\n" +
                                        "AND\n" +
                                        "\tdep.dep_name LIKE ?";
                                logger.info("查询部门 - sql = " + sql);

                                // 2.收集数据
                                tags = new ArrayList<Object>();
                                tags.add(socityID); // 社区id
                                tags.add(version); // 数据版本
                                tags.add(isUsed); // 是否有效
                                tags.add(visitType); // 访问类型 0测试 1生产
                                tags.add("%" + split[0] + "%"); // 部门名称
                                logger.info("查询部门 - tags = " + tags);

                                // 3.调用dao查询数据
                                mapList = baseDao.queryForList(sql, tags.toArray());

                                if (mapList == null || mapList.size() ==0) {
                                    map = ResultMap.creatReault("1", "成功", "结果集为空");
                                    map.put("type", 1); // 部门

                                    logger.info("出去《全局查询 -- 根据级别查询》list()方法；出参 = " + JSON.toJSONString(map));
                                    return  map;
                                }

                                map = ResultMap.creatReault("0", "成功", mapList);
                                map.put("type", 1); // 部门

                                logger.info("出去《全局查询 -- 根据级别查询》list()方法；出参 = " + JSON.toJSONString(map));
                                return map;
                            case 2:
                                logger.info("查询主业务");
                                // 查询主业务
                                // 1.封装sql
                                sql = "SELECT\n" +
                                        "\tb.ID,\n" +
                                        "\tb.bizz_name,\n" +
                                        "\tbl.descs,\n" +
                                        "\tbl.url\n" +
                                        "FROM\n" +
                                        "\tbizz b,\n" +
                                        "\tdepartment_bizz db,\n" +
                                        "\tbizz_logo bl,\n" +
                                        "\t(\n" +
                                        "\t\tSELECT\n" +
                                        "\t\t\tdep.ID\n" +
                                        "\t\tFROM\n" +
                                        "\t\t\tdepartments dep,\n" +
                                        "\t\t\tsocity s,\n" +
                                        "\t\t\tsocity_department sd\n" +
                                        "\t\tWHERE\n" +
                                        "\t\t\ts.ID = sd.soc_id\n" +
                                        "\t\tAND sd.dep_id = dep.ID\n" +
                                        "\t\tAND\ts.ID = ?\n" +
                                        "\t\tAND\ts.version = ?\n" +
                                        "\t\tAND\ts.is_used = ?\n" +
                                        "\t\tAND\ts.visit_type = ?\n" +
                                        "\t\tAND dep.dep_name LIKE ?\n" +
                                        "\t) p\n" +
                                        "WHERE\n" +
                                        "\tp.ID = db.dep_id\n" +
                                        "AND b.ID = bl.bizz_id\n" +
                                        "AND b.ID = db.bizz_id\n" +
                                        "AND b.version = ?\n" +
                                        "AND b.is_used = ?\n" +
                                        "AND b.visit_type = ?\n" +
                                        "AND b.bizz_name LIKE ?";
                                logger.info("查询主业务 - sql = " + sql);

                                // 2.收集数据
                                tags = new ArrayList<Object>();
                                tags.add(socityID); // 社区id
                                tags.add(version); // 数据版本
                                tags.add(isUsed); // 是否有效
                                tags.add(visitType); // 访问类型 0测试 1生产
                                tags.add("%" + split[0] + "%"); // 部门名称
                                tags.add(version); // 数据版本
                                tags.add(isUsed); // 是否有效
                                tags.add(visitType); // 访问类型 0测试 1生产
                                tags.add("%" + split[1] + "%"); // 主业务名称
                                logger.info("查询主业务 - tags = " + tags);

                                // 3.调用dao查询数据
                                mapList = baseDao.queryForList(sql, tags.toArray());

                                if (mapList == null || mapList.size() ==0) {
                                    map = ResultMap.creatReault("1", "成功", "结果集为空");
                                    map.put("type", 2); // 主业务

                                    logger.info("出去《全局查询 -- 根据级别查询》list()方法；出参 = " + JSON.toJSONString(map));
                                    return  map;
                                }

                                map = ResultMap.creatReault("0", "成功", mapList);
                                map.put("type", 2); // 主业务

                                logger.info("出去《全局查询 -- 根据级别查询》list()方法；出参 = " + JSON.toJSONString(map));
                                return map;
                            case 3:
                                logger.info("查询子业务");
                                // 查询子业务
                                // 1.封装sql
                                sql = "SELECT\n" +
                                        "\tbp.ID chl_id,\n" +
                                        "\tbp.bizz_name chl_name\n" +
                                        "FROM\n" +
                                        "\tbizz bp,\n" +
                                        "\t(\n" +
                                        "\t\tSELECT\n" +
                                        "\t\t\tb.ID\n" +
                                        "\t\tFROM\n" +
                                        "\t\t\tbizz b,\n" +
                                        "\t\t\tdepartment_bizz db,\n" +
                                        "\t\t\t(\n" +
                                        "\t\t\t\tSELECT\n" +
                                        "\t\t\t\t\tdep.ID\n" +
                                        "\t\t\t\tFROM\n" +
                                        "\t\t\t\t\tdepartments dep,\n" +
                                        "\t\t\t\t\tsocity s,\n" +
                                        "\t\t\t\t\tsocity_department sd\n" +
                                        "\t\t\t\tWHERE\n" +
                                        "\t\t\t\t\ts.ID = sd.soc_id\n" +
                                        "\t\t\t\tAND sd.dep_id = dep.ID\n" +
                                        "\t\t\t\tAND s.ID = ?\n" +
                                        "\t\t\t\tAND s.version = ?\n" +
                                        "\t\t\t\tAND s.is_used = ?\n" +
                                        "\t\t\t\tAND s.visit_type = ?\n" +
                                        "\t\t\t\tAND dep.dep_name LIKE ?\n" +
                                        "\t\t\t) p\n" +
                                        "\t\tWHERE\n" +
                                        "\t\t\tp.ID = db.dep_id\n" +
                                        "\t\tAND b.ID = db.bizz_id\n" +
                                        "\t\tAND b.version = ?\n" +
                                        "\t\tAND b.is_used = ?\n" +
                                        "\t\tAND b.visit_type = ?\n" +
                                        "\t\tAND b.bizz_name LIKE ?\n" +
                                        "\t) pp\n" +
                                        "WHERE\n" +
                                        "\tbp.bizz_parent_id = pp.ID\n" +
                                        "AND bp.version = ?\n" +
                                        "AND bp.is_used = ?\n" +
                                        "AND bp.visit_type = ?\n" +
                                        "AND bp.bizz_name LIKE ?";
                                logger.info("查询子业务 - sql = " + sql);

                                // 2.收集数据
                                tags = new ArrayList<Object>();
                                tags.add(socityID); // 社区id
                                tags.add(version); // 数据版本
                                tags.add(isUsed); // 是否有效
                                tags.add(visitType); // 访问类型 0测试 1生产
                                tags.add("%" + split[0] + "%"); // 部门名称
                                tags.add(version); // 数据版本
                                tags.add(isUsed); // 是否有效
                                tags.add(visitType); // 访问类型 0测试 1生产
                                tags.add("%" + split[1] + "%"); // 主业务名称
                                tags.add(version); // 数据版本
                                tags.add(isUsed); // 是否有效
                                tags.add(visitType); // 访问类型 0测试 1生产
                                tags.add("%" + split[2] + "%"); // 子业务名称
                                logger.info("查询子业务 - tags = " + tags);

                                // 3.调用dao查询数据
                                mapList = baseDao.queryForList(sql, tags.toArray());

                                if (mapList == null || mapList.size() ==0) {
                                    map = ResultMap.creatReault("1", "成功", "结果集为空");
                                    map.put("type", 3); // 子业务

                                    logger.info("出去《全局查询 -- 根据级别查询》list()方法；出参 = " + JSON.toJSONString(map));
                                    return  map;
                                }

                                map = ResultMap.creatReault("0", "成功", mapList);
                                map.put("type", 3); // 子业务

                                logger.info("出去《全局查询 -- 根据级别查询》list()方法；出参 = " + JSON.toJSONString(map));
                                return map;
                            default:
                                break;
                        }
                    }
                }
            } else {
                logger.info("参数为空");
                map = ResultMap.creatReault("88", "失败", "参数为空");
                logger.info("出去《全局查询 -- 根据级别查询》list()方法；出参 = " + JSON.toJSONString(map));
                return map;
            }
        } catch (ClassCastException e) {
            logger.info("后台处理异常，异常信息1：" + ExceptionDetailMessage.getExceptionDetail(e));
            map = ResultMap.creatReault("98", "失败", "参数类型错误");
            logger.info("出去《全局查询 -- 根据级别查询》list()方法；出参 = " + JSON.toJSONString(map));
            return map;
        } catch (Exception e) {
            logger.info("后台处理异常，异常信息1：" + ExceptionDetailMessage.getExceptionDetail(e));
            map = ResultMap.creatReault("99", "失败", "后台处理异常");
            logger.info("出去《全局查询 -- 根据级别查询》list()方法；出参 = " + JSON.toJSONString(map));
            return map;
        }

        logger.info("出去《全局查询 -- 根据级别查询》list()方法；出参 = " + JSON.toJSONString(map));
        return map;
    }
}
